<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<link rel="STYLESHEET" href="lib.css" type='text/css' />
<link rel="SHORTCUT ICON" href="../icons/pyfav.png" type="image/png" />
<link rel='start' href='../index.html' title='Python documentation Index' />
<link rel="first" href="lib.html" title='Python library Reference' />
<link rel='contents' href='contents.html' title="Contents" />
<link rel='index' href='genindex.html' title='Index' />
<link rel='last' href='about.html' title='About this document...' />
<link rel='help' href='about.html' title='About this document...' />
<link rel="next" href="module-SimpleHTTPServer.html" />
<link rel="prev" href="module-SocketServer.html" />
<link rel="parent" href="internet.html" />
<link rel="next" href="module-SimpleHTTPServer.html" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name='aesop' content='information' />
<title>18.19 BaseHTTPServer -- Basic HTTP server</title>
</head>
<body>
<div class="navigation">
<div id='top-navigation-panel' xml:id='top-navigation-panel'>
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="18.18.3 requesthandler Objects"
  href="node634.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="18. internet Protocols and"
  href="internet.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="18.20 simplehttpserver  "
  href="module-SimpleHTTPServer.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python库参考</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'>
<b class="navlabel">前一节:</b>
<a class="sectref" rel="prev" href="node634.html">18.18.3 请求处理对象</a>
<b class="navlabel">上一级:</b>
<a class="sectref" rel="parent" href="internet.html">18. Internet协议和支持</a>
<b class="navlabel">下一节:</b>
<a class="sectref" rel="next" href="module-SimpleHTTPServer.html">18.20 简单的Http服务器</a>
</div>
<hr /></div>
</div>
<!--End of Navigation Panel-->

<h1><a name="SECTION00201900000000000000000">
18.19 <tt class="module">BaseHTTPServer</tt> --
         基本的 HTTP 服务器</a>
</h1>

<p>
<a name="module-BaseHTTPServer"></a>

<p>
<a id='l2h-4313' xml:id='l2h-4313'></a><a id='l2h-4314' xml:id='l2h-4314'></a><a id='l2h-4345' xml:id='l2h-4345'></a>

<p>
这个模块定义了两个实现 HTTP 服务器
(Web 服务器)的类。 通常地， 这个模块不被直接使用，但被用来作为构建功能性 Web 服务器的一个基类。 参阅
<tt class="module"><a href="module-SimpleHTTPServer.html">SimpleHTTPServer</a></tt><a id='l2h-4346' xml:id='l2h-4346'></a> and
<tt class="module"><a href="module-CGIHTTPServer.html">CGIHTTPServer</a></tt><a id='l2h-4347' xml:id='l2h-4347'></a> 模块。
<p>
第一个类， <tt class="class">HTTPServer</tt>， 是
<tt class="class">SocketServer.TCPServer</tt> 的一个子类。它创建并监听HTTP socket， 发送请求到一个处理程序。创建和运行这个服务器的  Code(代码) 像这样：<p>
<div class="verbatim"><pre>
def run(server_class=BaseHTTPServer.HTTPServer,
        handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
</pre></div>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><span class="typelabel">class</span>&nbsp;<tt id='l2h-4315' xml:id='l2h-4315' class="class">HTTPServer</tt></b>(</nobr></td>
  <td><var>server_address, RequestHandlerClass</var>)</td></tr></table></dt>
<dd>这个类通过存储依照实例的 <tt class="member">server_name</tt> 和 <tt class="member">server_port</tt>变量指定的服务器地址构建在 <tt class="class">TCPServer</tt> 类之上。该服务器通过处理程序可以访问，典型地通过处理程序的 <tt class="member">server</tt>(服务器) 实例变量。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><span class="typelabel">class</span>&nbsp;<tt id='l2h-4316' xml:id='l2h-4316' class="class">BaseHTTPRequestHandler</tt></b>(</nobr></td>
  <td><var>request, client_address, server</var>)</td></tr></table></dt>
<dd>
这个类被用来处理到达服务器的 HTTP 请求。单独地，它不能响应任意实际的 HTTP 请求，必须是子类来处理每个请求方法 (例如， GET 或 POST)。<tt class="class">BaseHTTPRequestHandler</tt> 通过子类为使用提供一些类和实例变量以及方法。

<p>
  该处理操作程序将解析请求和头，然后调用请求类型的具体方法。该方法名称由请求构建。例如，例如请求方法 "<tt class="samp">SPAM</tt>"，<tt class="method">do_SPAM()</tt> 将不使用任何参数被调用。所有相关的信息被存储在处理程序的实例变量中。子类不需要重载和扩展
  <tt class="method">__init__()</tt> 方法。</dl>

<p>
<tt class="class">BaseHTTPRequestHandler</tt> 有下列实例变量：<p>
<dl><dt><b><tt id='l2h-4317' xml:id='l2h-4317' class="member">client_address</tt></b></dt>
<dd>包含关连的客户端地址这样格式<code>(<var>host</var>, <var>port</var>)</code>的一个元组。</dl>

<p>
<dl><dt><b><tt id='l2h-4318' xml:id='l2h-4318' class="member">command</tt></b></dt>
<dd>
包含的命令 (请求类型)。例如，<code>'GET'</code>。</dl>

<p>
<dl><dt><b><tt id='l2h-4319' xml:id='l2h-4319' class="member">path</tt></b></dt>
<dd>
包含的请求路径。
</dl>

<p>
<dl><dt><b><tt id='l2h-4320' xml:id='l2h-4320' class="member">request_version</tt></b></dt>
<dd>
包含请求版本的字符串。例如，<code>'HTTP/1.0'</code>。</dl>

<p>
<dl><dt><b><tt id='l2h-4321' xml:id='l2h-4321' class="member">headers</tt></b></dt>
<dd>
  控制(Holds)由<tt class="member">MessageClass</tt>
类变量指定的类的一个实例。这个实例解析和管理 HTTP 请求中的头。
</dl>

<p>
<dl><dt><b><tt id='l2h-4322' xml:id='l2h-4322' class="member">rfile</tt></b></dt>
<dd>
  包含一个输入流，定位在可选的输入数据开头。
</dl>

<p>
<dl><dt><b><tt id='l2h-4323' xml:id='l2h-4323' class="member">wfile</tt></b></dt>
<dd>
  包含写到客户端响应的输出流。当写给这个流时坚持使用正确的HTTP协议。
</dl>

<p>
<tt class="class">BaseHTTPRequestHandler</tt> 有下列类变量：<p>
<dl><dt><b><tt id='l2h-4324' xml:id='l2h-4324' class="member">server_version</tt></b></dt>
<dd>
  指定服务器软件版本。你可能想要重载它。格式是多个空格分隔的字符串，每个字符串的格式是name[/version]。例如，<code>'BaseHTTP/0.2'</code>。</dl>

<p>
<dl><dt><b><tt id='l2h-4325' xml:id='l2h-4325' class="member">sys_version</tt></b></dt>
<dd>
包含Python系统版本，通过
<tt class="member">version_string</tt> 方法和 <tt class="member">server_version</tt> 类变量，以一种方便可用的格式。例如，<code>'Python/1.4'</code>。</dl>

<p>
<dl><dt><b><tt id='l2h-4326' xml:id='l2h-4326' class="member">error_message_format</tt></b></dt>
<dd>
  为构建响应到客户端的错误构建一个格式字符串。它使用括号， 关键的格式区分符，因此该格式操作对象必须是一个字典。<var>code</var>关键字应该是一个整数，指定数字的 HTTP 错误代码值。<var>message</var>应该是一个包含 (详细的) 发生的错误信息的字符串，<var>explain</var>应该是错误代码号的解释。缺省 <var>message</var> 和 <var>explain </var>值可以在 <var>responses</var> 类变量中找到。
</dl>

<p>
<dl><dt><b><tt id='l2h-4327' xml:id='l2h-4327' class="member">protocol_version</tt></b></dt>
<dd>这指定在响应中使用的 HTTP 协议版本。如果设置为<code>'HTTP/1.1'</code>，服务器将允许 HTTP 持续连接；然而，那么你的服务器<em>必须 </em>在所有它到客户端响应中包含一个正确的<code>Content-Length</code> 头 (使用 <tt class="method">send_header()</tt>)。为了向下的兼容性，缺省设置为 <code>'HTTP/1.0'</code>。</dl>

<p>
<dl><dt><b><tt id='l2h-4328' xml:id='l2h-4328' class="member">MessageClass</tt></b></dt>
<dd>指定一个类似于<tt class="class">rfc822.Message</tt> 的类解析 HTTP
头。典型地，不被重载，并且缺省为
<tt class="class">mimetools.Message</tt>。<a id='l2h-4330' xml:id='l2h-4330'></a></dl>

<p>
<dl><dt><b><tt id='l2h-4331' xml:id='l2h-4331' class="member">responses</tt></b></dt>
<dd>
  这个变量包含一个错误代码整数到包含一个短的和一个长的信息的两个元素的元组的映射。例如
<code>{<var>code</var>: (<var>shortmessage</var>, <var>longmessage</var>)}</code>。
<var>shortmessage</var> 通常被用作错误响应中 <var>message</var> 关键字，<var>longmessage</var> 用作 <var>explain</var> 关键字
(参阅 <tt class="member">error_message_format</tt> 类变量)。
</dl>

<p><tt class="class">BaseHTTPRequestHandler</tt> 实例有下列方法：<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4332' xml:id='l2h-4332' class="method">handle</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
调用 <tt class="method">handle_one_request()</tt>一次 (或，如果能够持续连接，多次) 处理进来的 HTTP 请求。你从不需要重载它；替代，实现对应的
<tt class="method">do_*()</tt> 方法。</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4333' xml:id='l2h-4333' class="method">handle_one_request</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>这个方法将解析和分派请求到对应的<tt class="method"> do_*()</tt> 方法。你从不需要重载它。</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4334' xml:id='l2h-4334' class="method">send_error</tt></b>(</nobr></td>
  <td><var>code</var><big>[</big><var>, message</var><big>]</big><var></var>)</td></tr></table></dt>
<dd>
  发送并记录一个完整的错误回复到客户端。数字的
<var>code</var> 指定 HTTP 错误代码，以 <var>message</var> 作为可选的，更多指定的文本。全套的头被发送，后面紧跟使用 the <tt class="member">error_message_format</tt>
类变量组成的文本。</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4335' xml:id='l2h-4335' class="method">send_response</tt></b>(</nobr></td>
  <td><var>code</var><big>[</big><var>, message</var><big>]</big><var></var>)</td></tr></table></dt>
<dd>
  发送一个响应头并记录已接收的请求。HTTP 响应行被发送，后面紧跟 <em>Server</em> 和 <em>Date</em>
头。这两个头的值分别地从
<tt class="method">version_string()</tt> 和 <tt class="method">date_time_string()</tt> 方法中获得。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4336' xml:id='l2h-4336' class="method">send_header</tt></b>(</nobr></td>
  <td><var>keyword, value</var>)</td></tr></table></dt>
<dd>
编写一个指定的 HTTP 头到输出流。 <var>keyword</var>
应该指定头关键字，<var>value</var> 指定它的值。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4337' xml:id='l2h-4337' class="method">end_headers</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  发送一个空白行，表示响应中的 HTTP 头结束。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4338' xml:id='l2h-4338' class="method">log_request</tt></b>(</nobr></td>
  <td><var></var><big>[</big><var>code</var><big>[</big><var>, size</var><big>]</big><var></var><big>]</big><var></var>)</td></tr></table></dt>
<dd>
记录一个已接收的 (成功的) 请求。<var>code</var> 指定关联响应的数字的 HTTP 代码。如果响应的大小可用，那么它应该作为
<var>size</var> 参数被传递。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4339' xml:id='l2h-4339' class="method">log_error</tt></b>(</nobr></td>
  <td><var>...</var>)</td></tr></table></dt>
<dd>
  当一个请求不能被完成时记录一个错误。缺省，它传递信息给 <tt class="method">log_message()</tt>，因此它取相同的参数 (<var>format</var> 和 附加值)。</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4340' xml:id='l2h-4340' class="method">log_message</tt></b>(</nobr></td>
  <td><var>format, ...</var>)</td></tr></table></dt>
<dd>
记录一个随机信息给 <code>sys.stderr</code>。典型地重载创建自定义的错误日志结构。
<var>format</var> 参数是一个标准的printf风格的格式化字符串，附加参数给 <tt class="method">log_message()</tt> 用于输出格式。客户端地址和当前的日期时间被作为记录的每个信息的前缀。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4341' xml:id='l2h-4341' class="method">version_string</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  返回服务器软件的版本字符串。这是一个 <tt class="member">server_version</tt> 和 <tt class="member">sys_version</tt> 类变量的联合。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4342' xml:id='l2h-4342' class="method">date_time_string</tt></b>(</nobr></td>
  <td><var></var><big>[</big><var>timestamp</var><big>]</big><var></var>)</td></tr></table></dt>
<dd>
  返回通过 <var>timestamp</var> 给定的日期和时间(必须是由 <tt class="function">time.time()</tt>返回的格式)，格式化一个信息头。
如果 <var>timestamp</var> 被省略，它使用当前的日期和时间。

<p>
结果像 <code>'Sun, 06 Nov 1994 08:49:37 GMT'</code>。<span class="versionnote">2.5 版本中的新特性： <var>timestamp</var> 参数。</span>

</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4343' xml:id='l2h-4343' class="method">log_date_time_string</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
  返回当前的日期和时间，格式化日志。
</dl>

<p>
<dl><dt><table cellpadding="0" cellspacing="0"><tr valign="baseline">
  <td><nobr><b><tt id='l2h-4344' xml:id='l2h-4344' class="method">address_string</tt></b>(</nobr></td>
  <td><var></var>)</td></tr></table></dt>
<dd>
返回客户端地址，格式化日志。一个名称的查找被执行在客户端的IP地址上。</dl>

<p>
<div class="seealso">
  <p class="heading">也见：</p>

  <dl compact="compact" class="seemodule">
    <dt>模块 <b><tt class="module"><a href="module-CGIHTTPServer.html">CGIHTTPServer</a></tt>:</b>
    <dd>支持 CGI
                            脚本的扩展请求处理程序。
  </dl>

<p>
<dl compact="compact" class="seemodule">
    <dt>模块 <b><tt class="module"><a href="module-SimpleHTTPServer.html">SimpleHTTPServer</a></tt>:</b>
    <dd>基本的请求处理程序，限制响应文件实际上在目录的根下面。</dl>
</div>

<div class="navigation">
<div class='online-navigation'>
<p></p><hr />
<table align="center" width="100%" cellpadding="0" cellspacing="2">
<tr>
<td class='online-navigation'><a rel="prev" title="18.18.3 requesthandler Objects"
  href="node634.html"><img src='../icons/previous.png'
  border='0' height='32'  alt='Previous Page' width='32' /></a></td>
<td class='online-navigation'><a rel="parent" title="18. internet Protocols and"
  href="internet.html"><img src='../icons/up.png'
  border='0' height='32'  alt='Up one Level' width='32' /></a></td>
<td class='online-navigation'><a rel="next" title="18.20 simplehttpserver  "
  href="module-SimpleHTTPServer.html"><img src='../icons/next.png'
  border='0' height='32'  alt='Next Page' width='32' /></a></td>
<td align="center" width="100%">Python库参考</td>
<td class='online-navigation'><a rel="contents" title="Table of Contents"
  href="contents.html"><img src='../icons/contents.png'
  border='0' height='32'  alt='Contents' width='32' /></a></td>
<td class='online-navigation'><a href="modindex.html" title="Module Index"><img src='../icons/modules.png'
  border='0' height='32'  alt='Module Index' width='32' /></a></td>
<td class='online-navigation'><a rel="index" title="Index"
  href="genindex.html"><img src='../icons/index.png'
  border='0' height='32'  alt='Index' width='32' /></a></td>
</tr></table>
<div class='online-navigation'><b class="navlabel">前一节:</b> <a class="sectref" rel="prev" href="node634.html">18.18.3 请求处理对象</a> <b class="navlabel">上一级:</b> <a class="sectref" rel="parent" href="internet.html">18. Internet协议和支持</a> <b class="navlabel">下一节:</b> <a class="sectref" rel="next" href="module-SimpleHTTPServer.html">18.20 简单的Http服务器</a></div>
</div>
<hr />
<span class="release-info">2.5.1 版， 文档更新在 2007，4，18。翻译：<a href="http://www.zkfarmer.org">zkfarmer</a>。</span></div>
<!--End of Navigation Panel-->
<address>
关于建议修改的信息查阅 <i><a href="about.html">关于这个文档...</a></i> 。
</address>
</body>
</html>
